0からCFn templateを作る
大きく以下5step
1.icon CloudFormationのtemplate referenceみながら、「作りそうなResource」に目星をつける
2.icon 目星ついたら、関係性を紙に書く
3.icon ここで、git repoの準備する
4.icon 3の準備ができたら、{実際に作成するResource Pattern1}.ymlを作る
5.icon 完成した!そしたら、 git pushする
作る時に意識していることはtsawada.icon
いかにはやく「Stack作ってみた」まで持っていくか
やっぱ目に見えると楽しい。
https://gyazo.com/203a5923e0b8245373e1fe0cfe96a565
どんだけ小さくても「Green」帰ってくると嬉しいtsawada.icon
いかに「プラモデル」っぽくやるか
Cloudformationって、「Resource(AWS Service)」をいかに組み合わせるか。
Resourceを一つ一つ別fileで持っておく
コメントアウト/コメントイン使って「ResourceのON/OFF」を行う
楽しいtsawada.icon
以下駄文tsawada.icon
0.iconもともとCD/CI環境を構築しておく
1.icon CloudFormationのtemplate referenceみながら、「作りそうなResource」に目星をつける
作るResourceの種類を見極めちゃう
2.icon 目星ついたら、関係性を紙に書く
ここで関係性が見えてくると「作る順序」「DependsOn のタイミング」が見えてくる。
特に「IAM Roleに付与すべき権限」はここで見えてくる
ここで「作るResource」を確定する
3.icon ここで、git repoの準備する
ここで「作るResouce」はイメージついているので以下dir構成まで作っちゃうtsawada.icon
code:dir
.
├── Makefile
├── README.md
├── buildspec.yml
├── cloudformation
│ ├── {実際に作成するResource Pattern1}.yml
│ ├── {実際に作成するResource Pattern2}.yml
│ ├── {実際に作成するResource Pattern3}.yml
│ ├── env
│ │ ├── {Group A}.yml
│ │ ├── {Group B}.yml
│ │ └── {Group C}.yml
│ └── resources
│ ├── {生成するResource X}.yml
│ ├── {生成するResource Y}.yml
│ └── {生成するResource Z}.yml
└── serverless.yml
「うまくResource作れたか?」はterminal.iconsls deploy ~~~~ でcheckする。
checkするためにも、まずはbuidspec.ymlを作る。sls deploy ~~~が固まるtsawada.icon
code:buildspec.yml
version: 0.2
phases:
install:
runtime-versions:
nodejs: 12
commands:
- npm install -g serverless
- npm install
build:
commands:
- sls deploy --stage $STAGE --role ds-proper # "--role" 部分で、Group A,B,Cの指定
sls deploy するにはserverless.ymlが必須。まずはaccountIdなどを正しくしながらパッと作る
code:serverless.yml
service: datalake-user-${opt:role}
provider:
name: aws
stage: ${opt:stage, self:custom.defaultStage}
region: ${opt:region, self:custom.defaultRegion}
custom:
defaultStage: dev
defaultRegion: ap-northeast-1
accountId:
dev: 123456789012
stg: 234567890123
prod: 345678901234
branchName:
dev: source
stg: develop
prod: master
KMSMasterKeyID:
dev: *******************
env: ${file(./cloudformation/env/${opt:role}.yml)}
resources:
# dev/stg/prodの違いはもちろん、 GroupA/B/Cによっても「作るResource」が変わる
# ResourceはPattern分けして管理する
- ${file(./cloudformation/${self:custom.env.resourcesTemplate.${self:provider.stage}})}
{Group A}.ymlを作る。最初のresourcesTemplateを作る。ここがないとsls deploy成功しない
code:ds-proper.yml
resourcesTemplate:
dev: default.yml
stg: default.yml
prod: default.yml
4.icon 3の準備ができたら、{実際に作成するResource Pattern1}.ymlを作る
まずは、以下のように「全部コメントアウトした状態」で作る
cloudformationでは基本「上から順に」作られるので2.iconで見えた関係性を元に上から順に記載する
code:{実際に作成するResource Pattern1}.yml
Resources:
# ExtendDataBucket: ${file(./cloudformation/resources/ExtendDataBucket.yml)}
# AthenaWorkGroup: ${file(./cloudformation/resources/AthenaWorkGroup.yml)}
# AnalyticsRole: ${file(./cloudformation/resources/AnalyticsRole.yml)}
# AnalyticsSageMakerInstanceLifecycle: ${file(./cloudformation/resources/AnalyticsSageMakerInstanceLifecycle.yml)}
# AnalyticsSageMakerInstance: ${file(./cloudformation/resources/AnalyticsSageMakerInstance.yml)}
上から順にコメントアウトを解除。
code:{実際に作成するResource Pattern1}.yml
Resources:
ExtendDataBucket: ${file(./cloudformation/resources/ExtendDataBucket.yml)}
# AthenaWorkGroup: ${file(./cloudformation/resources/AthenaWorkGroup.yml)}
# AnalyticsRole: ${file(./cloudformation/resources/AnalyticsRole.yml)}
# AnalyticsSageMakerInstanceLifecycle: ${file(./cloudformation/resources/AnalyticsSageMakerInstanceLifecycle.yml)}
# AnalyticsSageMakerInstance: ${file(./cloudformation/resources/AnalyticsSageMakerInstance.yml)}
解除したものに対して、Resource fileを作る
最初はAWSのサイトから適当にパクってくる。
パクった中で「必須入力」はちゃんとかく。他は適当
code:ExtendDataBucket.yml
Type: AWS::S3::Bucket
Properties:
BucketName: datalake-extdata-${opt:role}-${self:custom.accountId.${self:provider.stage}}
さっさとterminal.iconsls deployする。
通るはず。
通ったら、一つずつ keyを追加していく。
結果、以下のようになる
code:ExtendDataBucket.yml
Type: AWS::S3::Bucket
Properties:
BucketName: datalake-extdata-${opt:role}-${self:custom.accountId.${self:provider.stage}}
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: aws:kms
KMSMasterKeyID: ${self:custom.KMSMasterKeyID.${self:provider.stage}}
途中、「ええ…書きかたわかんねえよ」となったら
適宜「ああ…ここの値は外に出している方が管理しやすくていいな」と思ったら、以下のようにしていく
code:ds-proper.yml
resourcesTemplate:
dev: default.yml
stg: default.yml
prod: default.yml
AthenaWorkGroup:
QuerySize: 10000000
IAMRole:
AssumeRole:
- arn:aws:iam::123456789012:user/sawachin
SageMaker:
InstanceType: ml.t2.medium
DirectInternetAccess: Enabled
RootAccess: Enabled
VolumeSizeInGB: 5
一つResource完成した。次に行く。
5.icon 完成した!そしたら、 git pushする
aws.iconAWSのdevelop branchにpush!
Slackの通知をそわそわしながら待つ。
通った!終了!